//package expressaoevolutiva;
import java.util.*;

public class Individual
{
	Chromossome[] fita;

	int size; //Numero de genes em cada cromossomo
	int n; //Quantidade de cromossomos

	public Individual(int n, int size)
	{
		this.size = size;
		this.n = n;

		fita = new Chromossome[n];

		for (int i=0; i<n; i++)
		{
			fita[i] = new Chromossome(size);
		}
	}

	public float getFitness()
	{
		double[] X = fita[0].getX(); //TODO: Apenas o primeiro cromossomo sendo acessado.

		Ackley ack = new Ackley(X);

		return  1/((float)(1+ack.getValue()));

	}

	public void mutacao()
	{
		Random rnd = new Random();
				
		for (int i=0; i<size; i++)
		{
			double valorGene = fita[0].getGenAt(i).getValue();
			while (true)
			{
				valorGene = valorGene + getSiAt(i) * rnd.nextGaussian();
				if ((valorGene >= -15) && (valorGene <= 15))
					break;
			}
			fita[0].getGenAt(i).setValue(valorGene);
		}
	}
	
	public String toString()
	{
		String value = "";
		
		for (int i=0; i<n; i++)
		{
			value += fita[i];
			value += "\n";
		}
		
		return value;
	}
	
	public Individual copia()
	{
		Individual novoIndividuo = new Individual(this.n, this.size);
		
		for (int i=0; i<n; i++)
		{
			for (int j=0; j<size; j++)
			{
				novoIndividuo.fita[i].setGenAt(j,new Gen(this.fita[i].getGenAt(j).getValue()));
				novoIndividuo.fita[i].si[j] = this.fita[i].si[j];
			}
			
		}
		
	
		//novoIndividuo.setSi(this.getSi());
		
		return novoIndividuo;
	}
	
	/*
	public void setSi(int iCromossomo, double valor)
	{
		this.fita[iCromossomo].setSi(valor);
	}*/
	
	public void setSiAt(int pos, double valor)
	{
		this.fita[0].setSiAt(pos, valor);
	}
	
	public double getSiAt(int pos)
	{
		return this.fita[0].getSiAt(pos);
	}
	
	/*
	public double getSi()
	{
		return this.fita[0].getSi();
	}
	*/
}